-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "socket_low_power"
VERSION = "1.0"
PRODUCT_KEY = "123" --换成自己的
-- sys库是标配
_G.sys = require("sys")
_G.sysplus = require("sysplus")

log.style(1)

local period = 3* 60* 60 * 1000 --3小时唤醒一次
--[[
按照硬件手册中的约定，可以作为终端触发的引脚编号，只有
101,102,107
]]
local Device_ON_OFF_PIN = 101 -- 按实际开发板选取


--函数：设备进入休眠模式，并且防止失败
local function Enter_Sleep_Mode()
    pm.dtimerStart(3, period)  --启动深度休眠定时器
    mobile.flymode(0,true)     --进入飞行模式 
    pm.power(pm.WORK_MODE,3)   --进入极致功耗模式

    --demo演示唤醒时间是一分钟，如果15s后模块重启，则说明进入极致功耗模式失败，
    log.info(rtos.meminfo("sys"))
    sys.wait(15000)   
    log.info("进入极致功耗模式失败，尝试重启")
    rtos.reboot()
end

--任务：在设备上电以后，初始化按键引脚，上拉，下降沿触发，在中断处理函数中推送消息
sys.taskInit(function ()
    --pwrkey在当前的项目中接地处理，需要close
    --不通过按钮控制，按钮连接wakeup引脚
    --pwrkey对应的gpio编号是35
    gpio.close(35)

    --配置wakeup中断，外部唤醒用
    gpio.setup(Device_ON_OFF_PIN, function() 
        sys.publish("BUTTON_PUSH")
        end, gpio.PULLUP,gpio.FALLING)
end)

--任务：检测用户是否长按按钮，若是长按，则关机进入深度睡眠模式    
sys.taskInit(function ()
    while true do
        --如果收到中断触发的消息，才开始后续的长按检测，否则不断的进行等待
        local r = sys.waitUntil("BUTTON_PUSH", 1000)
        if r == true then
            local low_state_count = 0
            for i = 0,10 do
                sys.wait(100) --等待100ms，即消除抖动，也保证是用户是长按的，长按关机
                local s = gpio.get(Device_ON_OFF_PIN)
                if s == gpio.LOW then
                    low_state_count = low_state_count + 1
                end
            end
            --表示用户此时已经有明确的关机意愿，开始准备进入低功耗休眠模式
            if low_state_count >= 7 then
                Enter_Sleep_Mode()
            end
            
        end
    end
end)

--设备默认上电开启

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

